#coding:utf-8

class 命名错误(Exception):
    def __init__(self, 函数, 行数, message):
        self.函数=函数
        self.行数=行数
        print("没有这个名字！ \n Error： NameNoFoundError \n Code：404 \n Break Point:<stdin> {0}, {1}function", 行数, 函数)
        e=行数*404*(random.randint(1, 65536))

class 系统错误(Exception):
    def __init__(self, message):
        print("系统抽风啦！ \n Error SystemError \n Code:500 \n BreakPoint:Unknown")
        e=hex(500*random.randint(4, 2**20))

class 网络错误(Exception):
    def __init__(self, 链接, message):
        print("诶，这个网址哪儿去了？ \n Error InternetConnect Error \n Code:502 \n BreakPoint:Unknown")
        e=bin(502*random.randint(8, 2**40))
        os.system('explorer "控制面板/网络和Internet/网络连接"')

class 语法错误(ValueError):

    def __init__(self, 信息, 文件名, 行号, 列号, 源码=None, message):
        self.信息 = 信息
        self.文件名 = 文件名
        self.行号 = 行号 if 行号 > 0 else 1
        self.列号 = 列号 if 列号 > 0 else 1
        self.源码 = 源码
        print("你写的什么？语法不对哦 \n 错误点:{0}中位于第{1}行, 第{2}列的{3}".format(文件名, 行号, 列号, 源码))
        e=oct(404*random.randint(16,1024576))

    # TODO: 应使错误更易定位
    def __str__(self):
        反馈信息 = '文件 "%s", 第%d行, 第%d列, %s' % (
            self.文件名, self.行号, self.列号, self.信息)
        if self.源码:
            行 = self.源码[(self.行号 - 1)]
            出错位置 = self.列号 - 1
            反馈信息 = '%s\n%s' % (反馈信息, 行[:出错位置] + 行[出错位置:])

        # 为规避中文字符在命令行中宽度与英文不等导致的^指向不准问题, 直接在错误位置插入指示符
        return 反馈信息


class 词法错误(语法错误,Exception):

    def __init__(self, 异常, 文件名, 源码=None, message):
        self.信息 = '分词时没认出这个词 "%s"' % 源码[异常.getsourcepos().idx]
        self.文件名 = 文件名
        self.行号 = 异常.getsourcepos().lineno
        self.列号 = 异常.getsourcepos().colno
        self.源码 = 源码.split("\n")
        print(信息)
        e=oct(500*random.radint(32, 1024576*4))

class 分词错误(词法错误, Exception):

    def __init__(self, 异常, 文件名, 源码=None, message):
        self.反馈信息='有错别词! "%s"(在%s中)' % 源码[异常.getsourcepos().idx] % 文件名[异常.getsourcepos().idx]
        self.文件名=文件名
        self.源码=源码
        print(反馈信息)
        e=oct(500*random.radint(32, 1024576*2))